/*
 * @Author: i@douxuefeng.cn
 * @Date: 2022-05-14 16:54:10
 * @LastEditTime: 2022-05-14 16:55:52
 * @LastEditors: i@douxuefeng.cn
 * @Description:
 * @FilePath: \go-utils\wechat\mp\openapi\openapi.go
 */
package openapi

import (
	"encoding/json"

	"gitee.com/douxuefeng/go-utils/request"
	"gitee.com/douxuefeng/go-utils/wechat/mp/accesstoken"
	"gitee.com/douxuefeng/go-utils/wechat/mp/mpconfig"
	"gitee.com/douxuefeng/go-utils/wechat/mp/params"
)

const (
	clear_quota = "https://api.weixin.qq.com/cgi-bin/clear_quota?access_token="
	check_quota = "https://api.weixin.qq.com/cgi-bin/openapi/quota/get?access_token="
	check_rid   = "https://api.weixin.qq.com/cgi-bin/openapi/rid/get?access_token="
)

type openApi struct {
	*mpconfig.MpConfig
}

func NewOpenApi(cfg *mpconfig.MpConfig) *openApi {
	return &openApi{cfg}
}

/**
 * @name: 清空api的调用quota
 * @description:
 * 1、如果要清空公众号的接口的quota，则需要用公众号的access_token；如果要清空小程序的接口的quota，则需要用小程序的access_token；如果要清空第三方平台的接口的quota，则需要用第三方平台的component_access_token
 * 2、如果是第三方服务商代公众号或者小程序清除quota，则需要用authorizer_access_token
 * 3、每个帐号每月共10次清零操作机会，清零生效一次即用掉一次机会；第三方帮助公众号/小程序调用时，实际上是在消耗公众号/小程序自身的quota
 * 4、由于指标计算方法或统计时间差异，实时调用量数据可能会出现误差，一般在1%以内
 * @param {*}
 * @return {*}
 */
func (mp *openApi) ClearQuita() params.Err {
	token, err := accesstoken.GetAccessToken(mp.MpConfig)
	if err != nil {
		return params.Err{
			Errcode: -1,
			Errmsg:  err.Error(),
		}
	}
	url := clear_quota + token
	req := request.NewRequest()
	req.SetFormData(map[string]string{
		"appid": mp.Appid,
	})
	res, err := req.Post(url)
	if err != nil {
		return params.Err{
			Errcode: -1,
			Errmsg:  err.Error(),
		}
	}
	var result params.Err
	json.Unmarshal(res.Body(), &result)
	return result
}

/**
 * @name:查询openAPI调用quota
 * @description:
 * 1、如果查询的api属于公众号的接口，则需要用公众号的access_token；如果查询的api属于小程序的接口，则需要用小程序的access_token；如果查询的接口属于第三方平台的接口，则需要用第三方平台的component_access_token；否则会出现76022报错。
 * 2、如果是第三方服务商代公众号或者小程序查询公众号或者小程序的api，则需要用authorizer_access_token
 * 3、每个接口都有调用次数限制，请开发者合理调用接口
 * 4、/xxx/sns/xxx这类接口不支持使用该接口，会出现76022报错。
 * @param {string} path api的请求地址，例如"/cgi-bin/message/custom/send";不要前缀https://api.weixin.qq.com ，也不要漏了"/",否则都会76003的报错
 * @return {*}
 */
func (mp *openApi) CheckQuota(path string) params.CheckQuota {
	token, err := accesstoken.GetAccessToken(mp.MpConfig)
	if err != nil {
		return params.CheckQuota{
			Errcode: -1,
			Errmsg:  err.Error(),
		}
	}
	url := check_quota + token
	req := request.NewRequest()
	req.SetFormData(map[string]string{
		"cgi_path": path,
	})
	res, err := req.Post(url)
	if err != nil {
		return params.CheckQuota{
			Errcode: -1,
			Errmsg:  err.Error(),
		}
	}
	var result params.CheckQuota
	json.Unmarshal(res.Body(), &result)
	return result
}

func (mp *openApi) CheckRid(rid string) params.CheckRid {
	token, err := accesstoken.GetAccessToken(mp.MpConfig)
	if err != nil {
		return params.CheckRid{
			Errcode: -1,
			Errmsg:  err.Error(),
		}
	}
	url := check_rid + token
	req := request.NewRequest()
	req.SetFormData(map[string]string{
		"rid": rid,
	})
	res, err := req.Post(url)
	if err != nil {
		return params.CheckRid{
			Errcode: -1,
			Errmsg:  err.Error(),
		}
	}
	var result params.CheckRid
	json.Unmarshal(res.Body(), &result)
	return result
}
